﻿using System;
using System.Linq;
using System.Windows.Forms;
using Csla;
using Csla.Tools;
using Csla.Tools.Plantillas;
using Csla.Validation;
using DemoCSLA.Libreria.Editables;
using DemoCSLA.Libreria.SoloLectura;
using DemoCSLA.Windows.Prompts;

namespace DemoCSLA.Windows.Facturas
{
    public partial class frmMntFacturaCabecera : _PlantillaMntDeGestor
    {
        #region Declaracion de Variables

        private FacturaCabecera m_FacturaCabecera;

        #endregion

        #region Constructores

        public frmMntFacturaCabecera()
        {
            InitializeComponent();
        }

        public frmMntFacturaCabecera(FacturaCabecera mFacturaCabecera)
        {
            // Llamada necesaria para el Diseñador de Windows Forms.
            InitializeComponent();

            // Agregue cualquier inicialización después de la llamada a InitializeComponent().
            m_FacturaCabecera = mFacturaCabecera;
            this.facturaCabeceraBindingSource.DataSource = m_FacturaCabecera;
        }

        #endregion

        #region Eventos del Formulario

        public override void Formulario(Object sender, EventArgs e)
        {
            base.Formulario(sender, e);
        }

        #endregion

        #region Actualizar

        public override void Actualizar(Object sender, EventArgs e)
        {
            //Si tu formulario contiene listas que deseas cargar al iniciar
            //colocalos aquí, es ESTRICTAMENTE recomendable que uses un manejador de errores
            //puedes usarlo desde el Snippet que tiene como acceso directo 'excepcioncsla'
            base.Actualizar(sender, e);
        }

        #endregion

        #region Boton Grabar

        public override void Grabar(Object sender, EventArgs e)
        {
            this.facturaCabeceraBindingSource.RaiseListChangedEvents = false;
            try
            {
                this.facturaCabeceraBindingSource.EndEdit();
                this.DetalleskryptonDataGridView.EndEdit();
                //Aqui puedes colocar algunas propiedades adicionales para guardar
                this.m_FacturaCabecera.Save();
                base.Grabar(sender, e);
            } //Esto hará que el formulario se cierre automáticamente
            catch (DataPortalException ex)
            { MessageBox.Show(ex.BusinessException.Message, ex.BusinessException.Source, MessageBoxButtons.OK, MessageBoxIcon.Information); }
            catch (ValidationException)
            { MessageBox.Show(m_FacturaCabecera.BrokenRulesCollection.ToString(), "Grabar", MessageBoxButtons.OK, MessageBoxIcon.Information); }
            catch (Exception ex)
            { MessageBox.Show(ex.Message, "Grabar", MessageBoxButtons.OK, MessageBoxIcon.Information); }

            this.facturaCabeceraBindingSource.RaiseListChangedEvents = true;
        }

        #endregion

        #region Boton Cancelar

        public override void Cancelar(Object sender, EventArgs e)
        {
            this.facturaCabeceraBindingSource.CancelEdit();
            base.Cancelar(sender, e); //Esto hará que el formulario se cierre automáticamente
        }

        #endregion

        #region Filtros

        private void btnClientes_Click(object sender, EventArgs e)
        {
            try
            {
                using (var f = new frmPromptClientes())
                {
                    f.CadenaBusqueda = clienteTextBox.Text;
                    if (f.ShowDialog(this) == DialogResult.OK)
                    {
                        var info = (ClientesInfo)f.ListaObjetos.First();
                        m_FacturaCabecera.IdCliente = info.IdCliente;
                        m_FacturaCabecera.Nombres = info.Nombres;
                        m_FacturaCabecera.Apellidos = info.Apellidos;
                        //clienteTextBox.Text = m_FacturaCabecera.Cliente;
                        info = null;
                    }
                }
            }
            catch (DataPortalException ex)
            { MessageBox.Show(ex.BusinessException.Message, ex.BusinessException.Source, MessageBoxButtons.OK, MessageBoxIcon.Information); }
            catch (Exception ex)
            { MessageBox.Show(ex.Message, "Clientes", MessageBoxButtons.OK, MessageBoxIcon.Information); }

        }

        #endregion

        #region Detalles

        private void btnAdd_Click(object sender, EventArgs e)
        {
            try
            {
                using (frmPromptProductos f = new frmPromptProductos())
                {
                    if (f.ShowDialog(this) == DialogResult.OK)
                    {
                        var info = (ProductoInfo)f.ListaObjetos.First();
                        var m_Detalle = m_FacturaCabecera.FacturaDetalles.AddNew();
                        m_Detalle.Codigo = info.Codigo;
                        m_Detalle.Descripcion = info.Descripcion;
                        m_Detalle.IdProducto = info.IdProducto;
                        m_Detalle.PrecioUnitario = info.PrecioUnitario;
                        m_Detalle.Cantidad = 1;
                        m_FacturaCabecera.FacturaDetalles.Add(m_Detalle);
                        info = null;
                        m_Detalle = null;
                    }
                }
            }
            catch (DataPortalException ex)
            { MessageBox.Show(ex.BusinessException.Message, ex.BusinessException.Source, MessageBoxButtons.OK, MessageBoxIcon.Information); }
            catch (Exception ex)
            { MessageBox.Show(ex.Message, "Adicionar", MessageBoxButtons.OK, MessageBoxIcon.Information); }

        }

        private void btnEdit_Click(object sender, EventArgs e)
        {
            try
            {
                using (frmPromptProductos f = new frmPromptProductos())
                {
                    if (f.ShowDialog(this) == DialogResult.OK)
                    {
                        var info = (ProductoInfo)f.ListaObjetos.First();
                        var m_Detalle = (FacturaDetalle)facturaDetallesBindingSource.Current;
                        m_Detalle.Codigo = info.Codigo;
                        m_Detalle.Descripcion = info.Descripcion;
                        m_Detalle.IdProducto = info.IdProducto;
                        m_Detalle.PrecioUnitario = info.PrecioUnitario;
                        m_Detalle.Cantidad = 1;
                        info = null;
                        m_Detalle = null;
                    }
                }
            }
            catch (DataPortalException ex)
            { MessageBox.Show(ex.BusinessException.Message, ex.BusinessException.Source, MessageBoxButtons.OK, MessageBoxIcon.Information); }
            catch (Exception ex)
            { MessageBox.Show(ex.Message, "Modificar", MessageBoxButtons.OK, MessageBoxIcon.Information); }
        }

        private void btnDel_Click(object sender, EventArgs e)
        {
            try
            {
                var m_Detalle = (FacturaDetalle)facturaDetallesBindingSource.Current;
                m_FacturaCabecera.FacturaDetalles.Remove(m_Detalle);
            }
            catch (DataPortalException ex)
            { MessageBox.Show(ex.BusinessException.Message, ex.BusinessException.Source, MessageBoxButtons.OK, MessageBoxIcon.Information); }
            catch (Exception ex)
            { MessageBox.Show(ex.Message, "Eliminar", MessageBoxButtons.OK, MessageBoxIcon.Information); }

        }

        #endregion



    }
}
